<?php
    
    /**
     * Clase que testea los campos del formulario de inscripción de un nuevo socio.
     */
    class InscripcionTest extends MY_Controller {
        
        function __construct() {
            parent::__construct();
    	}
        
        /*
         * index() se ejecuta por defecto al ser cargado del controlador
         */
        public function index(){
            
            $i=0;
            
            $apellido = 'perez';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '4000000';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = TRUE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Campos Válidos';
            $this->unit->run($test, $expected_result, $test_name);
            
            $apellido = '';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '3456788';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Apellido Vacío';
            $this->unit->run($test, $expected_result, $test_name);
            
            $apellido = 'perez 123';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '3456788';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Apellido Inválido';
            $this->unit->run($test, $expected_result, $test_name);
            
            $apellido = 'Moreira';
            $nombre = 'Juan';
            $tipoDocumento = 1;
            $numeroDocumento = '-123467';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = False;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Número de Documento negativo';
            $this->unit->run($test, $expected_result, $test_name);
          
            
         
               
            
            
            $apellido = 'Moreira';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '3.226385';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'domicilio cobro 2121';
            $zona = '1';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento, $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación numero de documento no entero';
            $this->unit->run($test, $expected_result, $test_name);
            
            
                      
           

            


            $apellido = 'Moreira';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '3999999';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = False;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Numero de documento menor a 4.000.000';
            $this->unit->run($test, $expected_result, $test_name);
            
            
            
            
            
            $apellido = 'Moreira';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '00000000';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = False;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Numero de documento igual a 0';
            $this->unit->run($test, $expected_result, $test_name);
            
            
            
            
            $apellido = 'asdakjdaksjdlaskjdkladjklasjdl';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '34567880';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = TRUE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Apellido Tamaño Límite';
            $this->unit->run($test, $expected_result, $test_name);
            
            $apellido = 'Rodriguez';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '3456788';
            $fechaNacimiento = '09/19/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Fecha';
            $this->unit->run($test, $expected_result, $test_name);
           
            $apellido = 'Rodriguez';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '3456788';
            $fechaNacimiento = '09/09/1888';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Rangos de Fecha de Nacimiento';
            $this->unit->run($test, $expected_result, $test_name);
            
             $apellido = 'Rodriguez';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '3456788';
            $fechaNacimiento = '09/09/2016';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Rangos de Fecha de Nacimiento';
            $this->unit->run($test, $expected_result, $test_name);
            
            
             $apellido = 'Rodriguez';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '3112222';
            $fechaNacimiento = '09/09/2016';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validacion Numero de Documento Longitud minima';
            $this->unit->run($test, $expected_result, $test_name);
            
              $apellido = 'Rodriguez';
            $nombre = 'juannnnnnnnnnnnnnnnnnnnnnnnnnnn';
            $tipoDocumento = 1;
            $numeroDocumento = '31123123';
            $fechaNacimiento = '09/09/1978';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validacion nombre longitud maximima';
            $this->unit->run($test, $expected_result, $test_name);
              $apellido = 'Rodriguez';
            $nombre = 'ju';
            $tipoDocumento = 1;
            $numeroDocumento = '311';
            $fechaNacimiento = '09/09/1978';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '10';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validacion nombre de Documento Longitud minima';
            $this->unit->run($test, $expected_result, $test_name);
           
            
            $apellido = 'Herrmann';
            $nombre = 'Emanuel';
            $tipoDocumento = 1;
            $numeroDocumento = '34567882';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '100';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación zona no valida';
            $this->unit->run($test, $expected_result, $test_name);
            
            $apellido = 'Herrmann';
            $nombre = 'Emanuel';
            $tipoDocumento = 1;
            $numeroDocumento = '44567882';
            $fechaNacimiento = '09/09/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '-1';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación zona no valida';
            $this->unit->run($test, $expected_result, $test_name);
            
             $apellido = 'Herrmann';
            $nombre = 'Emanuel';
            $tipoDocumento = 1;
            $numeroDocumento = '34567882';
            $fechaNacimiento = '09-01-1999';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '2';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación formato fecha';
            $this->unit->run($test, $expected_result, $test_name);
            
            
            $apellido = 'Herrmann';
            $nombre = 'Emanuel';
            $tipoDocumento = 1;
            $numeroDocumento = '34567882';
            $fechaNacimiento = '1989-01-09';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = 'Evergreen Gardens 430';
            $zona = '2';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = FALSE;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación formato fecha';
            $this->unit->run($test, $expected_result, $test_name);
           
             $apellido = 'Moreira';
            $nombre = 'juan';
            $tipoDocumento = 1;
            $numeroDocumento = '34226385';
            $fechaNacimiento = '9/9/1988';
            $domicilio = 'Evergreen Gardens 430';
            $domicilio_cobro = '';
            $zona = '0';
            $test = $this->validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento, $fechaNacimiento, $domicilio, $domicilio_cobro, $zona);
            $expected_result = False;
            $test_name = 'Prueba ' . ++$i . ' - Prueba Validación Formato de Fecha';
            $this->unit->run($test, $expected_result, $test_name);
            

            //Generación Reporte de Ejecución de las Pruebas
           
            echo $this->unit->report();
            
        }
        
        private function validacionDatosInscripcion($apellido, $nombre, $tipoDocumento, $numeroDocumento,
                                                        $fechaNacimiento, $domicilio, $domicilio_cobro, $zona){
            
            return ($this->validarApellidoONombre($apellido, 30) && $this->validarApellidoONombre($nombre, 30) &&
                    $this->validarDomicilioODomicilioCobro($domicilio, 50) && 
                    $this->validarDomicilioODomicilioCobro($domicilio_cobro, 50) &&
                    $this->validarZona($zona, 2) && 
                    $this->validarNumeroDocumento($numeroDocumento, 7, 8, 'models\M_socio,numero_documento,integer') &&
                    $this->validarFechaNacimiento($fechaNacimiento));
            
        }
        
        private function validarApellidoONombre($str, $val){
            
            return ($this->required($str) && $this->alphaApostropheSpace($str) &&
                    $this->max_length($str, $val) && $this->xss_clean($str) && $this->cleanQuery($str));
            
        }
        
        private function validarDomicilioODomicilioCobro($str, $val){
            
            return ($this->required($str) && $this->alphaApostropheSpaceNum($str) &&
                    $this->max_length($str, $val) && $this->xss_clean($str) && $this->cleanQuery($str));
            
        }
        
        private function rangoZona($str){
            return ($str >= '0' && $str <= '10') ? True:False;
        }
        
        private function validarZona($str, $val){
            
            return ($this->required($str) && $this->numeric($str) && $this->rangoZona($str) &&
                   $this->xss_clean($str) && $this->cleanQuery($str));
            
        }
       private function fotmatoNumeroDeDocumento ($str){
        
           
           return (!preg_match('/^\d{7,8}$/', $str)) ? FALSE : TRUE;

    }
        private function menorNumeroDeDocumentoPosible ($str){
        
            return ($str < '4000000' ) ? FALSE : TRUE;

    }
        private function validarNumeroDocumento($str, $val1, $val2, $params){
            
            return ($this->required($str) && $this->numeric($str) && $this->min_length($str, $val1) &&
                    $this->max_length($str, $val2) && $this->fotmatoNumeroDeDocumento($str) && $this->menorNumeroDeDocumentoPosible($str)&& $this->unique($str, $params) && $this->xss_clean($str) && $this->cleanQuery($str));
            
        }
        
        private function validarFechaNacimiento($fecha){
            
            return ($this->required($fecha) && $this->validar_formato($fecha) && $this->validar_fecha($fecha)
                    && $this->validar_nacimiento($fecha));
            
        }
        
        /**
	 * Minimum Length
	 *
	 * @access	public
	 * @param	string
	 * @param	value
	 * @return	bool
	 */
	private function min_length($str, $val)
	{
		if (preg_match("/[^0-9]/", $val))
		{
			return FALSE;
		}

		if (function_exists('mb_strlen'))
		{
			return (mb_strlen($str) < $val) ? FALSE : TRUE;
		}

		return (strlen($str) < $val) ? FALSE : TRUE;
	}

	/**
	 * Max Length
	 *
	 * @access	public
	 * @param	string
	 * @param	value
	 * @return	bool
	 */
	private function max_length($str, $val)
	{
		if (preg_match("/[^0-9]/", $val))
		{
			return FALSE;
		}

		if (function_exists('mb_strlen'))
		{
			return (mb_strlen($str) > $val) ? FALSE : TRUE;
		}

		return (strlen($str) > $val) ? FALSE : TRUE;
	}
        
        /**
         * Función de seguridad para utilizar como regla de Form Validation en CI.
         * Escapa los caracteres especiales (PostgreSQL, para MySQL ver
         * mysql_real_escape_string) y determina si el campo contiene palabras no
         * permitidas, en cuyo caso devuelve FALSE en la validación.
         *
         * @param <type> $str
         * @return <type>
         */
        private function cleanQuery($str) {

            //Si los caracteres especiales son automáticamente escapados, los "des-escapa".
            if (get_magic_quotes_gpc ()) {
                $str = stripslashes($str);
            }

            //Establece una conexión con la base de datos para obtener la versión de
            //PostgreSQL.

            $db_conn = pg_connect("host=localhost port=5432 dbname=MetodosDB user=postgres password=agu123");
            $pg_version = pg_version($db_conn);

            //Si la versión de PHP es mayor o igual a la 4.2.0 y la de PostgreSQL mayor
            //o igual a la 7.2 entonces se puede utilizar pg_escape_string, sino se utiliza
            //addslashes.
            if (phpversion() >= '4.2.0' && $pg_version['client'] >= '7.2') {
                $str = pg_escape_string($str);
            } else {
                $str = addslashes($str);
            }

            //Elimina tags HTML.
            $str = strip_tags($str);

            //Arreglo de palabras no permitidas.
            $invalidKeywords = array('select', 'from', 'where', 'union', 'insert',
                'update', 'join', 'create', 'delete');

            //Por cada palabra del arreglo, determina si aparece en la cadena. En ese caso,
            //retorna FALSE.
            for ($i = 0; $i < count($invalidKeywords); $i++) {
                $injection = stripos($str, $invalidKeywords[$i]);
                if (is_numeric($injection))
                    return FALSE;
            }

            //Sino, retorna TRUE.
            return TRUE;
        }

        /**
         * Función para la validación de campos con codeigniter. Valida que el valor
         * del campo sea unique en la base de datos.
         *
         * @param <type> $str El texto contenido en el campo.
         * @param <type> $params Un string, que representa una lista de parametros. Cada
         *                       parámetro va separado por coma, sin espacios. En este
         *                       caso se deben pasar 3 parametros: el nombre del modelo,
         *                       el nombre del campo y el tipo (string o integer).
         * @return <type> TRUE si es unique, FALSE caso contrario.
         */
        private function unique($str, $params) {

            //Separa los 3 parametros en las variables $model, $field y $type.
            list($model, $field, $type) = explode(',', $params, 3);

            //Crea una instancia del parametro $model.
            $instance = new $model();

            //Con esta instancia, llama a la funcion existe del modelo, la cual se
            //encargará de validar si efectivamente el campo es unique. Se le pasa como
            //parametros el valor del campo, el nombre del campo y el tipo (string o
            //integer).
            $yaExiste = $instance->existe($str, $field, $type);

            //Si ya existe, retorna FALSE y la validación falla. Sino retorna TRUE.
            if ($yaExiste) {
                return FALSE;
            } else {
                return TRUE;
            }
        }

        /**
         * Función para la validación de campos con codeigniter. Valida que el campo
         * sólo contenga letras, números o espacios.
         *
         * @param <type> $str El texto contenido en el campo.
         * @return <type>  TRUE si es satisfactorio, FALSE caso contrario.
         */
        private function alphanumericSpace($str){

            return ( ! preg_match('/^[a-zA-Z0-9ñÑáéíóúÁÉÍÓÚäëïöüÄËÏÖÜ ]*$/', $str)) ? FALSE : TRUE;
        }

        private function alphaApostropheSpace($str) {

            return (!preg_match('/^[a-zA-ZñÑáéíóúÁÉÍÓÚäëïöüÄËÏÖÜ\' ]*$/', $str)) ? FALSE : TRUE;
        }

        private function alphaApostropheSpaceNum($str) {

            return (!preg_match('/^[a-zA-Z0-9ñÑáéíóúÁÉÍÓÚäëïöüÄËÏÖÜ\' ]*$/', $str)) ? FALSE : TRUE;
        }

        public function requerido($str) {

            return (trim($str) == 0) ? FALSE : TRUE;

        }

        private function validar_formato($fecha){

            return (!preg_match('/^\d{1,2}\/\d{1,2}\/\d{4}$/', $fecha)) ? FALSE : TRUE;

        }

        private function validar_fecha($fecha){

            list($diaNac,$mesNac,$anioNac) = explode("/",$fecha);

            if(isset($diaNac) && isset($mesNac) && isset($anioNac))
                return checkdate($mesNac, $diaNac, $anioNac);
            else
                return FALSE;

        }
        
        private function validar_nacimiento($fechaString){

            $fechaDate = new DateTime($fechaString);
            $fechaMax = new DateTime(date('Y-m-d'));
            $fechaMin = new DateTime(date('Y-m-d',mktime(0, 0, 0, date("m")+1, date("d"), date("Y")-90)));

            return ($fechaMin < $fechaDate && $fechaDate < $fechaMax);

        }
        
        /**
	 * XSS Clean
	 *
	 * @access	public
	 * @param	string
	 * @return	string
	 */
	private function xss_clean($str)
	{
                $CI = & get_instance();
		return $CI->security->xss_clean($str);
	}
        
        /**
	 * Numeric
	 *
	 * @access	public
	 * @param	string
	 * @return	bool
	 */
	private function numeric($str)
	{
		return (bool)preg_match( '/^[\-+]?[0-9]*\.?[0-9]+$/', $str);

	}
        
        /**
	 * Required
	 *
	 * @access	public
	 * @param	string
	 * @return	bool
	 */
	private function required($str)
	{
		if ( ! is_array($str))
		{
			return (trim($str) == '') ? FALSE : TRUE;
		}
		else
		{
			return ( ! empty($str));
		}
	}
        
    }
    
?>